#include "QMLControlInterface.h"
#include <QJSEngine>
#include <QQmlEngine>
#include <QQmlContext>
#include <QDebug>

QMLControlInterface::QMLControlInterface(QObject *parent)
    : QObject(parent)
    , m_qmlContext(nullptr)
    , m_steeringFunction(QJSValue::NullValue)
    , m_movementFunction(QJSValue::NullValue)
    , m_generatorFunction(QJSValue::NullValue)
    , m_relayFunction(QJSValue::NullValue)
    , m_sprayFunction(QJSValue::NullValue)
    , m_coolingFunction(QJSValue::NullValue)
    , m_speedFunction(QJSValue::NullValue)
    , m_cutterFunction(QJSValue::NullValue)
    , m_platformFunction(QJSValue::NullValue)
    , m_emergencyStopFunction(QJSValue::NullValue)
{
}

void QMLControlInterface::setQMLContext(QObject *contextObject)
{
    m_qmlContext = contextObject;
    if (m_qmlContext) {
        initializeFunctionCache();
    }
}

bool QMLControlInterface::callQMLFunction(const QString &functionName, const QJSValueList &args)
{
    if (!m_qmlContext) {
        qWarning() << QString("无法调用QML函数 %1: QML上下文未设置").arg(functionName);
        emit controlCommandCompleted(functionName, false, "QML上下文未设置");
        return false;
    }

    // 直接使用QMetaObject::invokeMethod调用QML中的函数
    QVariant returnValue;
    bool success = QMetaObject::invokeMethod(
        m_qmlContext,
        functionName.toLocal8Bit().data(),
        Qt::DirectConnection,
        Q_RETURN_ARG(QVariant, returnValue),
        Q_ARG(QVariant, args.isEmpty() ? QVariant() : QVariant(args[0].toInt()))
    );

    if (!success) {
        QString error = QString("调用QML函数 %1 失败").arg(functionName);
        qWarning() << error;
        emit controlCommandCompleted(functionName, false, error);
        return false;
    }

    // 检查返回值
    bool result = returnValue.toBool();
    if (!result) {
        QString error = QString("函数 %1 返回失败").arg(functionName);
        qWarning() << error;
        emit controlCommandCompleted(functionName, false, error);
    } else {
        emit controlCommandCompleted(functionName, true, QString());
    }

    return result;
}

void QMLControlInterface::initializeFunctionCache()
{
    if (!m_qmlContext) return;

    // 简化实现：直接使用QML属性访问，无需缓存QJSValue
    // 函数指针缓存将按需调用时动态获取，提高稳定性
    qDebug() << "QML控制接口函数缓存初始化完成";
}

// =============== 控制函数实现 ===============

bool QMLControlInterface::sendSteeringControl(int value)
{
    qDebug() << QString("QML控制接口: 发送转向控制指令，值=%1").arg(value);
    return callQMLFunction("sendSteeringControlCommand", QJSValueList() << value);
}

bool QMLControlInterface::sendMovementControl(int value)
{
    qDebug() << QString("QML控制接口: 发送行进控制指令，值=%1").arg(value);
    return callQMLFunction("sendMovementControlCommand", QJSValueList() << value);
}

bool QMLControlInterface::sendGeneratorControl(int value)
{
    qDebug() << QString("QML控制接口: 发送发电机控制指令，值=%1").arg(value);
    return callQMLFunction("sendGeneratorControlCommand", QJSValueList() << value);
}

bool QMLControlInterface::sendRelayControl(int value)
{
    qDebug() << QString("QML控制接口: 发送继电器控制指令，值=%1").arg(value);
    return callQMLFunction("sendRelayControlCommand", QJSValueList() << value);
}

bool QMLControlInterface::sendSprayControl(int value)
{
    qDebug() << QString("QML控制接口: 发送喷水控制指令，值=%1").arg(value);
    return callQMLFunction("sendSprayControlCommand", QJSValueList() << value);
}

bool QMLControlInterface::sendCoolingControl(int value)
{
    qDebug() << QString("QML控制接口: 发送制冷控制指令，值=%1").arg(value);
    return callQMLFunction("sendCoolingControlCommand", QJSValueList() << value);
}

bool QMLControlInterface::sendSpeedControl(int speedValue)
{
    qDebug() << QString("QML控制接口: 发送速度控制指令，值=%1").arg(speedValue);
    return callQMLFunction("sendSpeedControlCommand", QJSValueList() << speedValue);
}

bool QMLControlInterface::sendCutterControl(int value)
{
    qDebug() << QString("QML控制接口: 发送割叶机控制指令，值=%1").arg(value);
    return callQMLFunction("sendCutterControlCommand", QJSValueList() << value);
}

bool QMLControlInterface::sendPlatformRemoteMode(int commandValue)
{
    qDebug() << QString("QML控制接口: 发送平台遥控模式指令，值=%1").arg(commandValue);
    return callQMLFunction("sendPlatformRemoteModeCommand", QJSValueList() << commandValue);
}

bool QMLControlInterface::emergencyStop()
{
    qDebug() << "QML控制接口: 执行紧急停止";
    
    // 紧急停止需要按顺序执行多个步骤
    // 这里我们调用QML中的紧急停止初始化函数
    return callQMLFunction("startEmergencyStop", QJSValueList());
}